/* Unicode.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 12/29/2015
 *  Last Modified   : 12/29/2015
 * 
 */

#pragma once
#ifndef ymp_Unicode_H
#define ymp_Unicode_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dependencies
#include <string>
namespace ymp{
namespace StringTools{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
const char      BYTE_ORDER_MARK_UTF8[]  = "\xef\xbb\xbf";
const char16_t  BYTE_ORDER_MARK_UTF16   = 0xfeff;
const char16_t  BYTE_ORDER_MARK_UTF16be = 0xfffe;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  UTF-8 <-> UTF-16
std::u16string  utf8_to_utf16   (const std::string& str);
std::string     utf16_to_utf8   (const std::u16string& str);
////////////////////////////////////////////////////////////////////////////////
//  UTF-8 <-> UTF-32
std::u32string  utf8_to_utf32   (const std::string& str);
std::string     utf32_to_utf8   (const std::u32string& str);
////////////////////////////////////////////////////////////////////////////////
//  UTF-16 <-> UTF-32
std::u32string  utf16_to_utf32  (const std::u16string& str);
std::u16string  utf32_to_utf16  (const std::u32string& str);
////////////////////////////////////////////////////////////////////////////////
//  wchar_t <-> UTF-8
std::wstring    utf8_to_wstr    (const std::string& str);
std::string     wstr_to_utf8    (const std::wstring& str);
////////////////////////////////////////////////////////////////////////////////
//  wchar_t <-> UTF-16
std::wstring    utf16_to_wstr   (const std::u16string& str);
std::u16string  wstr_to_utf16   (const std::wstring& str);
////////////////////////////////////////////////////////////////////////////////
//  wchar_t <-> UTF-32
std::wstring    utf32_to_wstr   (const std::u32string& str);
std::u32string  wstr_to_utf32   (const std::wstring& str);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
#endif
